package cliente.auxiliar;

import common.*;
import cliente.GereOperacoes;
import java.io.IOException;
import java.net.Socket;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author A8
 */
public class Recebe extends Thread {

    private Conexao ligacao;
    private GereOperacoes gestor;
    long tempoInicial;
    int num = 0;
    long limite = 5000;

    public Recebe(Conexao ligacao, GereOperacoes gestor) {
        this.ligacao = ligacao;
        this.gestor = gestor;
    }

    public Conexao getConexao() {
        return ligacao;
    }

    public GereOperacoes getGereOp() {
        return gestor;
    }

    public void run() {
        Menssagem mensagem = new Menssagem();
        while (true) {
            try {
                if (gestor.getConexao().getEstado().equalsIgnoreCase("Off")) {
                    return;
                }
                mensagem = (Menssagem) ligacao.getObjectInput().readObject();
                if(trataSMSInstatanias(mensagem))
                    gestor.trataMensagem(mensagem);
            } catch (IOException ex) {
                System.out.println("Tempo:" + System.currentTimeMillis());
                synchronized (this) {
                    try {
                        this.sleep(5000);
                    } catch (InterruptedException ex0) {
                        System.out.println("[Erro]:" + ex0.getMessage());
                    }
                }
                if (num == 0) {
                    gestor.getConexao().setEstado("Desligado");
                    if (gestor.getConexao().getEstado().equalsIgnoreCase("Desligado")) {
                        tempoInicial = System.currentTimeMillis();
                        gestor.getConexao().setEstado("Falha");
                    }
                    num++;
                }

                try {
                    Socket sock_tcp = new Socket(ligacao.getHost(), ligacao.getPort());
                    ligacao.setTcp_cliente(sock_tcp);
                    if (ligacao.Conexao_tcp() == 0) {
                        ligacao.setOut(ligacao.getObjectOutput());
                        ligacao.setIn(ligacao.getObjectInput());
                        gestor.setConexao(ligacao);
                        gestor.getEnvia().setLigacao(ligacao);
                        gestor.getConexao().setEstado("Ligado");
                        num = 0;
                    }

                    gestor.getEnvia().acorda();
                } catch (Exception ex1) {
                    System.out.println();
                    if (gestor.getConexao().getEstado().equalsIgnoreCase("Falha")) {
                        if (gestor.verificaTempo(tempoInicial)) {
                            //Passaram os 2 minutos
                            System.out.println("Estado mudado para falha!!!");
                            gestor.encenrraJanelasErro("Tempo de ligacao excedido!!!");
                            gestor.getConexao().setEstado("Desligado");
                        }
                    }
                }
            } catch (Exception ex) {
                System.out.println("[ERRO]:" + ex.getMessage());
            }
        }
    }

    public boolean trataSMSInstatanias(Menssagem resp){

        if(resp.getMenssagem().contains("Mensagens")){
            if(gestor.isDisplayMode())
                return true;
            else{
                gestor.getMyTwi().setNewMessageLabel();
                gestor.setMensagem(resp.getMenssagem());
                return false;
            }
        }
        return true;
    }
}
